﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MMessaging.Address
{
	/// <summary>
	/// Beispiel für eine simple Alife-Message, die das Interface IMAddressAlifeMessage
	/// implementiert.
	/// Der Service bestätigt mit dieser Message, dass er existiert und unter
	/// der gegebenen Sendeadresse zu erreichen ist. Außerdem wird er 
	/// diese Message alle "IntervallTime" Millisekunden erneut senden,
	/// bis er offline geht oder aus anderen Gründen nicht mehr verfügbar ist.
	/// Mit dieser Message gibt der Service außerdem an, welche Rollen er 
	/// ausübt, bzw. über welche Gruppenadressen er außerdem erreichbar sein will.
	/// </summary>
	public class MAddressIsAlifeMessage : MAddressMessageBase, IMAddressAlifeMessage
	{
		/// <summary>
		/// Der Service wird diese Message alle "IntervallTime" Millisekunden erneut senden.
		/// </summary>
		public int IntervallTime { get; private set; }
		/// <summary>
		/// Alle Rollen, die der Service spielt.
		/// Beachten, dass Rollenadressen keine Serviceadressen sein sollten.
		/// Darf nichts enthalten. Darf null zurückgeben.
		/// </summary>
		public IEnumerable<MAddress> Roles { get; private set; }

		/// <summary>
		/// Konstruktor
		/// </summary>
		/// <param name="receiver">
		/// </param>
		/// <param name="sender">
		/// </param>
		/// <param name="sendTime">
		/// UTC Zeit
		/// </param>
		/// <param name="intervallTime">
		/// Der Service wird diese Message alle "IntervallTime" Millisekunden erneut senden.
		/// </param>
		/// <param name="roles">
		/// Alle Rollen, die der Service spielt.
		/// Beachten, dass Rollenadressen keine Serviceadressen sein sollten.
		/// Darf nichts enthalten. Darf null zurückgeben.
		/// </param>
		public MAddressIsAlifeMessage(
			MAddress receiver,
			MAddress sender,
			DateTime sendTime,
			int intervallTime,
			IEnumerable<MAddress> roles
			) : base(receiver,sender,sendTime)
		{
			IntervallTime = intervallTime;
			Roles = roles;
		}

		public static MAddressIsAlifeMessage CreateIsAlifeMessage(
			int intervallTime,
			MAddress receiver,
			MAddress sender,
			IEnumerable<MAddress> roles,
			DateTime sendTime,
			Guid messageID)
		{
			return new MAddressIsAlifeMessage(
				receiver,
				sender,
				sendTime,
				intervallTime,
				roles);
		}

	}
}
